package behavior.Memento;

/**
 * Created by LYJ on 2016/10/21.
 * 详细链接：Memento（备忘录）http://blog.csdn.net/u013256816/article/details/51244961
 */
public class Maintest {
    public static void main(String... args) {
        Originator originators = new Originator(100,100);
        System.out.println("打怪之前...");
        originators.display();

        //存档
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(originators.saveMemento());

        //打怪掉血
        System.out.println("打怪中...");
        originators.setBloodValue(20);
        originators.setMagicValue(20);
        originators.display();

        //读取存档
        System.out.println("读取存档...");
        originators.readMemento(caretaker.getMemento());
        originators.display();
    }
}
/*
在备忘录模式中，最重要的就是备忘录Memento了。备忘录中存储的就是原发器的部分或者所有的状态信息，
而这些状态信息是不能够被其它对象所访问的，也就是说我们是不可能在备忘录之外的对象来存储这些状态信息，
如果暴漏了内部状态信息就违反了封装的原则，故备忘录是处理原发器外其它对象都是不可以访问的。
优缺点
优点：
1. 给用户提供了一种可以恢复状态的机制。可以是用户能够比较方便地回到某个历史的状态。
2. 实现了信息的封装。使得用户不需要关心状态的保存细节。
缺点：
1. 消耗资源。如果类的成员变量过多，势必会占用比较大的资源，而且每一次保存都会消耗一定的内存。
适用场景
1. 需要保存一个对象在某一时刻的状态或部分状态
2. 如果用一个接口来让其他对象得到这些状态，将会保留对象的实现细节并破坏对象的封装性，
一个对象不希望外界直接访问其内部状态，通过负责人可以间接访问其内部状态。
JDK中的备忘录模式：
Java.util.Date（Date对象通过自身内部的一个long值来实现备忘录模式）
java.io.Serializable
 */
